/**
 * Notes: API端点定义
 * Ver : WeCollege Server API 1.0.0
 * Date: 2025-01-27
 * Description: 统一定义所有API端点，便于维护和管理
 */

// API端点配置
const API_ENDPOINTS = {
  
  // ==================== 用户认证相关 ====================
  AUTH: {
    LOGIN: '/user/user/login',                    // 微信登录
  },
  
  // ==================== 帖子功能 ====================
  POST: {
    INSERT: '/post/insert',                       // 发布帖子
    UPDATE: '/post/update',                       // 更新帖子
    DELETE: '/post/del/{postId}',                 // 删除帖子
    QUERY: '/post/query',                         // 查询主页展示帖子
    QUERY_MY: '/post/queryMyPost',                // 分页查询我的帖子
    GET_SINGLE: '/post/getSinglePost/{postId}',   // 获取单个帖子详情
    LIKE: '/post/like/{postId}',                  // 点赞帖子
    DISLIKE: '/post/dislike/{postId}',            // 取消点赞
    VISIT: '/post/visit/{postId}',                // 访问帖子
  },
  
  // ==================== 评论功能 ====================
  COMMENT: {
    INSERT: '/comment/insert',                              // 评论
    DELETE: '/comment/deleteComment/{commentId}',           // 删除评论
    LIKE: '/comment/likeComment/{commentId}',               // 点赞评论
    DISLIKE: '/comment/dislikeComment/{commentId}',         // 取消点赞评论
    QUERY_BY_POST: '/comment/queryByPost',                  // 根据帖子查询需要展示的评论
    QUERY_MORE_SUB: '/comment/queryMoreSubcomment',         // 查询更多子评论
  },
  
  // ==================== 失物招领功能 ====================
  LOST: {
    INSERT: '/lost/insert',                       // 上传失物
    UPDATE: '/lost/update',                       // 编辑失物描述
    DELETE: '/lost/delete/{lostId}',              // 删除我的失物
    LIST: '/lost/list',                           // 首页展示失物
    QUERY_MY: '/lost/queryMyLost',                // 分页查询我的失物
    GET_ONE: '/lost/getOne/{lostId}',             // 获取单个失物详情
  },
  
  // ==================== 交易功能 ====================
  TRADE: {
    ADD: '/trade/add',                            // 新增商品
    UPDATE: '/trade/updateTrade',                 // 修改商品
    DELETE: '/trade/delete/{tradeId}',            // 下架我的商品
    QUERY: '/trade/query/{tradeId}',              // 单独查询商品
    QUERY_MAIN: '/trade/queryMainTrade',          // 查询主页展示商品
    QUERY_MY: '/trade/queryMyTrade',              // 分页查询我的商品
  },
  
  // ==================== 通用功能 ====================
  COMMON: {
    QUERY_TYPE: '/common/queryType',              // 查询所有帖子分类
    GET_BACKGROUND: '/common/getBackground',      // 查询轮播图
  },
  
  // ==================== 上传功能 ====================
  UPLOAD: {
    IMAGE: '/upload',                             // 上传图片
  },
  
  // ==================== 大模型调用功能 ====================
  MODEL: {
    GET_ACCESS_TOKEN: '/model/getAccessToken',    // 获取AccessToken
    INSERT_TAG: '/model/insert',                  // 调用大模型标签功能
    GET_PIC_TAG: '/model/getPicTag',              // 获取图片标签
  },
  
  // ==================== 微信通知功能 ====================
  PUSH: {
    SEND: '/push',                                // 推送微信通知
  }
};

/**
 * 构建带参数的URL
 * @param {string} endpoint - 端点模板
 * @param {object} params - 参数对象
 * @returns {string} 构建后的URL
 */
function buildUrl(endpoint, params = {}) {
  let url = endpoint;
  
  // 替换路径参数 {param}
  Object.keys(params).forEach(key => {
    const placeholder = `{${key}}`;
    if (url.includes(placeholder)) {
      url = url.replace(placeholder, params[key]);
      delete params[key]; // 从参数中移除已使用的参数
    }
  });
  
  return url;
}

/**
 * 获取API端点
 * @param {string} category - 分类
 * @param {string} action - 操作
 * @param {object} params - 路径参数
 * @returns {string} API端点
 */
function getEndpoint(category, action, params = {}) {
  const categoryEndpoints = API_ENDPOINTS[category.toUpperCase()];
  if (!categoryEndpoints) {
    throw new Error(`API分类 ${category} 不存在`);
  }
  
  const endpoint = categoryEndpoints[action.toUpperCase()];
  if (!endpoint) {
    throw new Error(`API操作 ${category}.${action} 不存在`);
  }
  
  return buildUrl(endpoint, params);
}

// 导出
module.exports = {
  API_ENDPOINTS,
  buildUrl,
  getEndpoint,
  
  // 便捷访问器
  AUTH: API_ENDPOINTS.AUTH,
  POST: API_ENDPOINTS.POST,
  COMMENT: API_ENDPOINTS.COMMENT,
  LOST: API_ENDPOINTS.LOST,
  TRADE: API_ENDPOINTS.TRADE,
  COMMON: API_ENDPOINTS.COMMON,
  UPLOAD: API_ENDPOINTS.UPLOAD,
  MODEL: API_ENDPOINTS.MODEL,
  PUSH: API_ENDPOINTS.PUSH,
};